學習 Git (9) - 遠端數據庫 GitHub


Posted by Calon on 2022-06-04

在學習 Git 過程中應該會常常聽到 GitHub,到底 GitHub 是什麼?又和 Git 是什麼關係?

什麼是 GitHub

GitHub 是一個商業網站,是目前最大的 Git server,我們可以將自己的作品、專案放到上面分享,也可以看到其他人分享的專案或是未他人的專案做出貢獻等,而再與其他人共同開發軟體專案時也會常常用到 GitHub 的服務。

另外除了 GitHub 外也有其他的遠端數據庫,例如:Bitbucket、GitLab 等。

那 Git 和 GitHub 到底是什麼關係?

如同之前介紹過的 Git 是一個工具,而 GitHub 則是一個網站

將本地端的資料上傳到 GitHub

建立新專案

我們要將資料上傳到 GitHub 的話首先要建立一個新專案:

  1. 我們可以先到 GitHub 上註冊一個帳號
  2. 註冊完後,點擊右上角的 + 會出現一個下拉選單,點擊裡面的 New repository

  3. 接著會進入到新增專案的設定畫面:

  • 在 Repository name 填上專案名稱,專案名稱不能重複。
  • 選擇存取權限有分開放 Public 以及私人 Private,在 2019 年以前選擇 Private 需要收取費用,而在 2019 年之後改為免費使用,並且在 2020/4/14 時宣佈 Private 不限制共同開發者人數,不過部份進階服務像是 GitHub Pages 服務的話,Private 是需要收錢的。
  1. 設定完之後按下最下面的 Create repository 就建立好新專案了。

將資料 Push 到 GitHub

新建完專案之後會跑出下圖的指引畫面:

如果是尚未使用 Git 來做版空的專案可以依照著「…or create a new repository on the command line」裡面的指示進行,如果已經有用 Git 進行版控的話則可以照著「…or push an existing repository from the command line」指引來上傳到 GitHub。
而這兩個指引的步驟差別只有在第 1 個指引多出了前 4 行指令:

echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"

第 1 行指令是建立 1 個 README.md 檔案並將 "# test" 存入這個檔案中,附檔名的 md 是 Markdown 格式的縮寫,而 Markdown 語法可以將純文字格式輕鬆轉換成 HTML 格式,非常方便。
除了第 1 行指令以外我們在之前學習 Git (2) - 開始使用_Git_進行版本控制以及學習 Git (3) - 開始版控的最後一步:Commit都有介紹過。

接下來我們開始將本地端的專案資料上傳到 GitHub 吧。首先我們需要設定一個遠端節點,以剛剛新建的 repository 為例:

$ git remote add origin https://github.com/calon719/test.git
  • git remote 跟遠端資料庫的操作有關。
  • add 是要加入遠端節點。
  • origin 則是這個節點的簡稱,指的是後面那串伺服器網址。

遠端節點預設會使用 origin,例如從 Server 上將專案 clone 下來的時候,它裡面的預設遠端節點簡稱就會是 origin。
當然如果不喜歡這個名稱也可以換一個:

$ git remote add default https://github.com/calon719/test.git

新增完之後我們可以加上 -v 參數來查看我們新增了哪些節點:

$ git remote -v
default https://github.com/calon719/test.git (fetch)
default https://github.com/calon719/test.git (push)
origin  https://github.com/calon719/test.git (fetch)
origin  https://github.com/calon719/test.git (push)

如果想要更改節點名稱,可以使用 rename

# git remote rename 舊名稱 新名稱
$ git remote rename default develop

如果有哪個節點不需要了也可以使用 remove 來刪除

$ git remote remove develop

接下來我們準備將專案上傳到 GitHub 上:

$ git push -u origin master

執行完後會出現以下訊息:

Username for 'https://github.com':
Password for 'https://calon719@github.com':

第一個訊息是要求輸入 Github 帳號,而第二個訊息則是要求輸入密碼,不過 2021 / 8 / 13 起就不支援密碼驗證上傳,必須使用 personal access token,詳細可以參考官方文件

成功執行的話會出現以下訊息:

$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 229 bytes | 229.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To To github.com:calon719/test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

接下來來講解 push 指令做了哪些事情:

  1. 將 master 分支的內容推向 origin。
  2. 如果 origin 對應的遠端 Server 上不存在名為 master 分支的話,會在遠端 Server 上建立一個同名分支。
  3. 如果遠端 Server 上有名為 master 的分支的話,便會移動 Server 上的該分支的位置,讓它指向最新進度。
  4. 加上 -u 參數會設定 upstream。

第四點的設定 upstream 是什麼?
設定 upstream 就是指當第一次成功推上去之後就會讓該分支開始追蹤指定的遠端分支,再第二次之後只需要輸入:

$ git push

就可以推到第一次指定的遠端分支。
而如果沒有設定 upstream 的話我們美一次推送都需要把遠端節點以及分支都打上去:

$ git push origin master

如果這時只有打 git push,後面沒有指定遠端節點與分支的話會出現錯誤訊息:

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

能推向不同名分支嗎?

我們剛才介紹的指令是長這樣:

$ git push origin master

但其實完整的指令是長這樣:

$ git push origin master:master
# git push origin <本地分支>:<遠端分支>

所以如果想要將現在的分支推到其他分支的話指需要將後面的分支名稱改掉就行了:

$ git push origin master:test

參考資料
  • 高見龍,《為你自己學 Git》

#Git







Related Posts

TDZ (Temporal Dead Zone)

TDZ (Temporal Dead Zone)

How to build CICD with Jenkins as code based on container

How to build CICD with Jenkins as code based on container

[PHP] 上傳大頭照的功能

[PHP] 上傳大頭照的功能


Comments